/**
 * Klasse zur einfachen Verwaltung von Datumsobjekten.
 * 
 * @author christoph.stueber@mes-alsfeld.de
 * @version Schuljahr 2013/2014
 *          erstellt 15.03.2014
 *          geändert 30.03.2014
 */
public class Datum
{
    // Instanzvariablen
    /**
     * Attribut für Tag.
     */
    private int tag;

    /**
     * Attribut für Monat.
     */
    private int monat;

    /**
     * Attribut für Jahr.
     */
    private int jahr;

    /**
     * Konstruktor zum Erzeugen von Objekten der Klasse Datum. Die Datumsobjekte
     * werden standardmäßig mit dem aktuellen Datum erzeugt.
     */
    public Datum()
    {
	java.util.GregorianCalendar d = new java.util.GregorianCalendar();
	tag = d.get(java.util.Calendar.DATE);
	monat = d.get(java.util.Calendar.MONTH) + 1;
	jahr = d.get(java.util.Calendar.YEAR);
    }

    /**
     * Konstruktor mit Parametern zum Erzeugen von Datumsobjekten.
     * 
     * @param t der Tag int
     * @param m der Monat int
     * @param j das Jahr int
     */
    public Datum(int t, int m, int j)
    {
	tag = t;
	monat = m;
	setJahr(j);
    }

    /**
     * Get-Methode für den Tag.
     * 
     * @return int
     */
    public int getTag()
    {
	return tag;
    }

    /**
     * Get-Methode für den Monat.
     * 
     * @return int
     */
    public int getMonat()
    {
	return monat;
    }

    /**
     * Get-Methode für das Jahr.
     * 
     * @return int
     */
    public int getJahr()
    {
	return jahr;
    }

    /**
     * Set-Methode für den Tag.
     * 
     * @param t int
     */
    public void setTag(int t)
    {
	tag = t;
    }

    /**
     * Set-Methode für den Monat.
     * 
     * @param m int
     */
    public void setMonat(int m)
    {
	monat = m;
    }

    /**
     * int2digit wandelt einen int Wert in einen String mit führender Null.
     * 
     * @param a
     * @return String
     */
    private String int2digit(int a)
    {
	StringBuilder sb = new StringBuilder(String.valueOf(a));
	if (sb.length() < 2)
	{
	    sb.insert(0, "0");
	}
	return sb.toString();
    }

    /**
     * Set-Methode für das Jahr. Die Interpretation von zweistelligen Werten
     * erfolgt entsprechend der Excel-Regel, dass 0-29 als 2000er und 30-99 als
     * 1900er Jahreszahlen betrachtet werden.
     * 
     * @param j int
     */
    public final void setJahr(int j)
    {
	if (j < 30)
	{
	    jahr = j + 2000;
	}
	else if (j < 100)
	{
	    jahr = j + 1900;
	}
	else
	{
	    jahr = j;
	}
    }

    /**
     * String-Darstellung eines Datum-Wertes.
     * 
     * @return String
     */
    public String toString()
    {
	StringBuilder s = new StringBuilder();
	s.append(int2digit(tag)).append(".");
	s.append(int2digit(monat)).append(".");
	s.append(int2digit(jahr));
	return s.toString();
    }

    /**
     * String-Darstellung eines Datum-Wertes im SQL-Format.
     * 
     * @return String
     */
    public String toSQLString()
    {
	StringBuilder s = new StringBuilder();
	s.append(int2digit(jahr));
	s.append("-");
	s.append(int2digit(monat));
	s.append("-");
	s.append(int2digit(tag));
	return s.toString();
    }

    /**
     * Vergleich zweier Datumswerte
     * 
     * @param d Datum
     * @return der Rückgabe wert ist größer Null, wenn das Datum des
     *         Datum-Objects nach dem von d liegt,
     *         ist gleich Null wenn beide gleich sind und kleiner Null, wenn das
     *         Datum des Datum-Objects vor dem
     *         von d liegt.
     */
    public int vergleicheMit(Datum d)
    {
	return this.toSQLString().compareTo(d.toSQLString());
    }

    public static void main(String[] args)
    {
	Datum d1 = new Datum(10, 1, 2014);

	Datum d2 = new Datum(9, 1, 2014);
	System.out.println(d1 + " == " + d2 + ": " + d1.vergleicheMit(d2));

	Datum d3 = new Datum(10, 1, 2014);
	System.out.println(d1 + " == " + d3 + ": " + d1.vergleicheMit(d3));

	Datum d4 = new Datum(11, 1, 2014);
	System.out.println(d1 + " == " + d4 + ": " + d1.vergleicheMit(d4));

    }
}
